package org.example.util;

import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.Data;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * POI 的Excel处理工具类
 */
@Data
public class ExcelUtil {

    /**
     * .xls 后缀名
     */
    public static final String XLS = ".xls";

    /**
     * .xlsx 后缀名
     */
    public static final String XLSX = ".xlsx";

    /**
     * 判断指定的单元格是否是合并单元格
     *
     * @param sheet  ：excel工作簿
     * @param row    ：行下标
     * @param column ：列下标
     * @return boolean
     */
    public static boolean isMergedRegion(Sheet sheet, int row, int column) {
        //合并单元格的数量
        int sheetMergeCount = sheet.getNumMergedRegions();
        //遍历所有合并单元格信息
        for (int i = 0; i < sheetMergeCount; i++) {
            //获取第i个合并单元格的信息
            CellRangeAddress range = sheet.getMergedRegion(i);
            //获取开始合并的列位置
            int startColumn = range.getFirstColumn();
            //获取结束合列的行位置
            int endColumn = range.getLastColumn();
            //获取开始合并的行位置
            int startRow = range.getFirstRow();
            //获取结束合并的行位置
            int endRow = range.getLastRow();
            /*
            判断row,column是否在合并的单元格里。
            即row大于开始合并的行位置，小于合并结束的行位置，
            并且column大于开始合并的列位置，小于合并结束的列位置
             */
            if (row >= startRow && row <= endRow) {
                if (column >= startColumn && column <= endColumn) {
                    return true;
                }
            }
        }
        return false;
    }


    /**
     * 获取合并单元格的值
     *
     * @param sheet  ：excel工作簿
     * @param row    ：行下标
     * @param column ：列下标
     * @return {String}
     */
    public static String getMergedRegionValue(Sheet sheet, int row, int column) {
        //合并单元格的数量
        int sheetMergeCount = sheet.getNumMergedRegions();
        //遍历所有合并单元格信息
        for (int i = 0; i < sheetMergeCount; i++) {
            //获取第i个合并单元格的信息
            CellRangeAddress range = sheet.getMergedRegion(i);
            //获取开始合并的列位置
            int startColumn = range.getFirstColumn();
            //获取结束合列的行位置
            int endColumn = range.getLastColumn();
            //获取开始合并的行位置
            int startRow = range.getFirstRow();
            //获取结束合并的行位置
            int endRow = range.getLastRow();

            if (row >= startRow && row <= endRow) {
                if (column >= startColumn && column <= endColumn) {
                    //获取值
                    Row fRow = sheet.getRow(startRow);
                    Cell fCell = fRow.getCell(startColumn);
                    return getCellValue(fCell);
                }
            }
        }
        return null;
    }

    /**
     * 获取融合行的数量
     *
     * @param sheet  ：excel工作簿
     * @param row    ：行下标
     * @param column ：列下标
     * @return int
     */
    public static int getMergedRowNum(Sheet sheet, int row, int column) {
        //合并单元格的数量
        int sheetMergeCount = sheet.getNumMergedRegions();
        //遍历所有合并单元格信息
        for (int i = 0; i < sheetMergeCount; i++) {
            //获取第i个合并单元格的信息
            CellRangeAddress range = sheet.getMergedRegion(i);
            //获取开始合并的列位置
            int startColumn = range.getFirstColumn();
            //获取结束合列的行位置
            int endColumn = range.getLastColumn();
            //获取开始合并的行位置
            int startRow = range.getFirstRow();
            //获取结束合并的行位置
            int endRow = range.getLastRow();
            if (row >= startRow && row <= endRow) {
                if (column >= startColumn && column <= endColumn) {
                    return endRow - startRow + 1;
                }
            }
        }
        return 1;
    }
    /**
     * 获取融合列的数量
     *
     * @param sheet  ：excel工作簿
     * @param row    ：行下标
     * @param column ：列下标
     * @return int
     */
    public static int getMergedColumnNum(Sheet sheet, int row, int column) {
        //合并单元格的数量
        int sheetMergeCount = sheet.getNumMergedRegions();
        //遍历所有合并单元格信息
        for (int i = 0; i < sheetMergeCount; i++) {
            //获取第i个合并单元格的信息
            CellRangeAddress range = sheet.getMergedRegion(i);
            //获取开始合并的列位置
            int startColumn = range.getFirstColumn();
            //获取结束合列的行位置
            int endColumn = range.getLastColumn();
            //获取开始合并的行位置
            int startRow = range.getFirstRow();
            //获取结束合并的行位置
            int endRow = range.getLastRow();
            if (row >= startRow && row <= endRow) {
                if (column >= startColumn && column <= endColumn) {
                    return endColumn - startColumn + 1;
                }
            }
        }
        return 1;
    }

    /**
     * 获取单元格的值,对Excel的各个单元格的格式进行判断并转换
     *
     * @param cell ：单元格
     * @return String
     */
    public static String getCellValue(Cell cell) {
        String cellValue = "";
        //输入的单元格为空，直接返回“”
        if (cell == null) {
            return cellValue;
        }
        //格式化数字
        DecimalFormat decimalFormat = new DecimalFormat("#");//有就写，没有就不写
        //获取单元格的类型，判断类型，使用对应的方法获取单元格的值
        switch (cell.getCellType()) {
            case STRING://字符串类型
                cellValue = cell.getRichStringCellValue().getString().trim();
                break;
            case NUMERIC://数字类型（double）
                cellValue = decimalFormat.format(cell.getNumericCellValue());
                break;
            case BOOLEAN://boolean类型，转换为字符串0或1
                cellValue = String.valueOf(cell.getBooleanCellValue());
                break;
            case FORMULA://浮点类型
                cellValue = cell.getCellFormula();
                break;
            default:
                cellValue = "";
        }
        return cellValue;
    }
}
